/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package wasolicitudesfiec.logicacontrol.SolicitarAyudantes;

import web.util.Constantes;
import entidad.Usuario;
import entidad.ayudantias.Solicitudayudantia;
import entidad.ayudantias.Solicitudserayudante;
import entidad.ayudantias.TipoAyudantia;
import entidad.ayudantias.TipoAyudantia.TipoAyudantiaEnum;
import hero.interfaces.BnNodePropertyValue;
import hero.interfaces.BnNodeValue;
import hero.interfaces.ProjectSession;
import hero.interfaces.UserSession;
import hero.util.HeroException;
import java.rmi.RemoteException;
import java.util.ArrayList;
import java.sql.Date;
import java.sql.Timestamp;
import java.text.SimpleDateFormat;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.ejb.CreateException;
import javax.faces.context.FacesContext;
import javax.naming.NamingException;
import wasolicitudesfiec.Ayudantias.SolicitarAyudantes.RevisarResultados;
import wasolicitudesfiec.SessionBean1;
import wasolicitudesfiec.authentication.AuthenticationPhaseListener;
import wasolicitudesfiec.general.MensajeException;
import wasolicitudesfiec.logicacontrol.*;
import wasolicitudesfiec.registros.Rg_CandidatoAyudante;
import web.util.SendMailEspol;

/**
 *
 * @author kabad
 */
public class CTRL_AnalisisDeResultadosDespuesDeConfirmacion extends CTRL_Base {

    private RevisarResultados gui;
    final String nombreActividad = Constantes.SolicitarAyudantes.revisarResultados;

//    public CTRL_AnalisisDeResultadosDespuesDeConfirmacion(RevisarResultados gui, FacesContext facesContext) {
    public CTRL_AnalisisDeResultadosDespuesDeConfirmacion(RevisarResultados gui, FacesContext facesContext) {
        super(facesContext);
        this.gui = gui;
        String instancia;
        instancia = (String) externalContext.getRequestParameterMap().get("instancia");
        if (instancia != null) {
            externalContext.getSessionMap().put("instancia", instancia);
        }
    }

    public String getNombreInstanciaProceso() {
        String instancia;
        instancia = (String) externalContext.getSessionMap().get("instancia");
        return instancia;
    }

    public void inicializar() throws MensajeException {
        ArrayList<Rg_CandidatoAyudante> listaRg_CandidatoAyudante = new ArrayList<Rg_CandidatoAyudante>();

        String nombreInstanciaProf;
        Solicitudayudantia solicitudAyudantia;
        TipoAyudantia tipoAyudantia;
        try {
            nombreInstanciaProf = this.getNombreInstanciaProceso();

            this.inicializarInstancia(nombreInstanciaProf);
            int idSolicitud = Integer.parseInt((String) prjSession.getProperty(Constantes.Atributo.idSolicitudProceso).getTheValue());
            solicitudAyudantia = logica.getLogAyudantia().leerSolicitudayudantiaNivel3(idSolicitud);

            tipoAyudantia = logica.leerTipoAyudantia(solicitudAyudantia);
            gui.getLabel4().setText(tipoAyudantia.getNombre() + ": ");
            String nombreAyudantia = "";
            if (tipoAyudantia.getTipo() == TipoAyudantiaEnum.ACADEMICA) {
                nombreAyudantia = solicitudAyudantia.getMateria().getNombre();
                gui.getLabel6().setText(nombreAyudantia);

            } else {
                nombreAyudantia = solicitudAyudantia.getAyudantiavaria().getNombre();
                gui.getLabel6().setText(nombreAyudantia);
            }
            Rg_CandidatoAyudante rg_CandidatoAyudante;

            for (Solicitudserayudante object : solicitudAyudantia.getListaSolicitudserayudante()) {
                if (object.getSeleccionado()) {
                    rg_CandidatoAyudante = new Rg_CandidatoAyudante();
                    rg_CandidatoAyudante.setSolicitudserayudante(object);
                    rg_CandidatoAyudante.setSeleccionado(object.getSeleccionado());
                    rg_CandidatoAyudante.setNombreInstancia(solicitudAyudantia.getNombreinstanciaproceso());

                    listaRg_CandidatoAyudante.add(rg_CandidatoAyudante);
                }
            }
            gui.getMenu().setTitulo(Constantes.Modelo.modelo_SolicitarAyudantes + "_" + idSolicitud + ": " + nombreActividad);
            gui.getDp_SeleccionAyudantes().setListaRg_CandidatoAyudante(listaRg_CandidatoAyudante);
        } catch (MensajeException exception) {
            throw exception;
        } catch (Exception exception) {
            exception.printStackTrace();
            Logger.getLogger(CTRL_AnalisisDeResultadosDespuesDeConfirmacion.class.getName()).log(Level.SEVERE, null, exception);
            throw new MensajeException(Constantes.Mensajes.noInicia);
        }
    }

    public void extenderRecepcionConfirmaciones() throws MensajeException {
        String nombreInstanciaProceso;
        Usuario usuarioConectado = (Usuario) externalContext.getSessionMap().get(AuthenticationPhaseListener.USER_SESSION_KEY);
        BnNodeValue actividad;
        BnNodePropertyValue property2;
        BnNodePropertyValue property;
        Solicitudayudantia solicitudAyudantia;
        Solicitudayudantia solicitudTemp;
        Solicitudayudantia solicitudAyudantia2;

        try {
            nombreInstanciaProceso = getNombreInstanciaProceso();
            this.inicializarInstancia(nombreInstanciaProceso);
            actividad = usrSession.getNode(nombreInstanciaProceso, nombreActividad);
            if (!(actividad != null && (actividad.getState() == hero.interfaces.Constants.Nd.READY || actividad.getState() == hero.interfaces.Constants.Nd.ANTICIPABLE))) {
                throw new Exception();
            }
            int idSolicitudAyudantia = Integer.parseInt(prjSession.getProperty(Constantes.Atributo.idSolicitudProceso).getTheValue());
            solicitudAyudantia = logica.getLogAyudantia().leerSolicitudayudantiaNivel2(idSolicitudAyudantia);
            java.util.Date fecha = (java.util.Date) gui.getCalendar1().getText();
            Date fechaMaxConfirmacion = new Date(fecha.getTime());
            if (!(fechaMaxConfirmacion.compareTo(solicitudAyudantia.getFechainicioayudantia()) < 0)) {
                throw new MensajeException("Fecha límite recepción confirmación de ayudantes debe ser anterior a ´Fecha inicio de la ayudantía´ (" + solicitudAyudantia.getFechainicioayudantia() + ")");
            }
            solicitudAyudantia.setFechaMaxConfimacion(fechaMaxConfirmacion);
            solicitudAyudantia2 = logica.getLogAyudantia().guardarYClonarSolicitudAyudantia(solicitudAyudantia);
            prjSession.setNodeProperty(nombreActividad, Constantes.Atributo.idSolicitudActividad, solicitudAyudantia2.getIdSolicitudAyudantia() + "");
            prjSession.setNodeProperty(nombreActividad, Constantes.Atributo.decisionEvaluacion, Constantes.Atributo.Decision.Prorrogar.toString());
            prjSession.setProperty("fechaMaxRecepcionConfirmacion", fechaMaxConfirmacion.getTime() + "");

            //tambiens etear fecha modificacion
//            solicitudAyudantia.setFechamodificacion(new Timestamp(fechaMaxConfirmacion.getTime()));

            solicitudTemp = logica.getLogAyudantia().guardarYClonarSolicitudAyudantia(solicitudAyudantia);// Este es una Solicitud que se usara en "Esperando Confirmacion de Estudiantes Seleccionados"

            prjSession.setProperty("idTempSolicitudActividad", solicitudTemp.getIdSolicitudAyudantia() + "");
            //cambiar ejecucion a manual en la actividad Esperando Confirmacion de Estudiantes Seleccionados
            String nombreActividad2 = Constantes.SolicitarAyudantes.esperarConfirmacion;
            prjSession.setNodeType(nombreActividad2, hero.interfaces.Constants.Nd.AND_JOIN_NODE);
            usrSession.startActivity(nombreInstanciaProceso, nombreActividad);
            //en cuanto ejecuto terminate el proceso termina inseperadamente
            usrSession.terminateActivity(nombreInstanciaProceso, nombreActividad);

            //Cambiar fecha de recepcion de los seleccionados que no contestaron           
            setFechaConfirmacionAEstudiantes(solicitudAyudantia2, solicitudTemp);

        } catch (MensajeException exception) {
            throw exception;
        } catch (Exception exception) {
            exception.printStackTrace();
            Logger.getLogger(CTRL_AnalisisDeResultadosDespuesDeConfirmacion.class.getName()).log(Level.SEVERE, null, exception);
            throw new MensajeException(Constantes.Mensajes.noGuarda);
        }
    }

    private void setFechaConfirmacionAEstudiantes(Solicitudayudantia solAyudActividadAnalisis,
            Solicitudayudantia solAyudActividadEsperandoConf) throws MensajeException {
        BnNodeValue actividad;
        Usuario usuarioConectado;
        ArrayList<Rg_CandidatoAyudante> listaRg_CandidatoAyudante;
        usuarioConectado = (Usuario) externalContext.getSessionMap().get(AuthenticationPhaseListener.USER_SESSION_KEY);
        Rg_CandidatoAyudante rg_candidato;
        String nombreActividadProrroga = Constantes.SolicitarSerAyudante.prorrogarConfirmacion;

        listaRg_CandidatoAyudante = gui.getDp_SeleccionAyudantes().getListaRg_CandidatoAyudante();
        logica.autenticaComodin();
        Solicitudserayudante solicitudserayudante;
        Solicitudserayudante solicitudserayudante2;
        try {
            ProjectSession prjSession = logica.getProjectSession();
            UserSession usrSession = logica.getUserSession();

            if ((usrSession == null)) {
                throw new Exception("UserSession no pudo ser inicializado");
            }
            if ((prjSession == null)) {
                throw new Exception("ProjectSession no pudo ser inicializado");
            }
            for (Object object : listaRg_CandidatoAyudante) {
                rg_candidato = (Rg_CandidatoAyudante) object;
                String nombreInstanciaProceso2 = rg_candidato.getSolicitudserayudante().getNombreinstanciaproceso();
                solicitudserayudante = rg_candidato.getSolicitudserayudante();
                if (rg_candidato.getSolicitudserayudante().getRespuestaConfirmacion().equals(
                        Constantes.Atributo.DecisionConfirmacion.NoContestar.toString())) {
                    if (nombreInstanciaProceso2 == null) {
                        throw new Exception("El nombre de la instancia no fue especificado");
                    }
                    usrSession.getModelInstancesTodoList(nombreInstanciaProceso2);
                    prjSession.initProject(nombreInstanciaProceso2);
                    actividad = usrSession.getNode(nombreInstanciaProceso2, nombreActividadProrroga);
                    if (!(actividad != null &&
                            (actividad.getState() == hero.interfaces.Constants.Nd.READY ||
                            actividad.getState() == hero.interfaces.Constants.Nd.ANTICIPABLE))) {
                        throw new Exception();
                    }
                    java.util.Date fecha = (java.util.Date) gui.getCalendar1().getText();

                    //Relizar actividad Prorrogar confirmacion de los estudiantes
                    solicitudserayudante.setFechaMaxRecepcionConfirmacion(new Date(fecha.getTime()));
                    logica.getLogAyudantia().guardarSolicitudserayudante(solicitudserayudante);

                    solicitudserayudante2 = logica.getLogAyudantia().leerSolicitudserayudante(solicitudserayudante.getIdSolicitudSerAyudante());
                    solicitudserayudante2.setFkIdSolicitudAyudantia(solAyudActividadAnalisis.getIdSolicitudAyudantia());
                    //para la actividad Prorrogar confirmacion
                    solicitudserayudante2 = logica.getLogAyudantia().clonarSolicitudserayudante(solicitudserayudante2);
                    prjSession.setNodeProperty(nombreActividadProrroga, Constantes.Atributo.idSolicitudActividad, solicitudserayudante2.getIdSolicitudSerAyudante() + "");
                    prjSession.setNodeProperty(nombreActividadProrroga, Constantes.Atributo.decisionProrrogar, Constantes.Atributo.DecisionProrrogar.Prorrogar.toString());
                    prjSession.setProperty("fechaMaxRecepcionConfirmacion", fecha.getTime() + "");

                    //almacenamos un registro correspondiente a la actividad  confirmacion del estudiante.
                    //esto lo hacemos para que cuando el estudiante no conteste igualmente se cree el registro de Confirmacion de estudiante
                    solicitudserayudante.setRespuestaConfirmacion(Constantes.Atributo.DecisionConfirmacion.NoContestar.toString());
//                    solicitudserayudante2.setFechamodificacion(new Date(fecha.getTime()));

                    logica.getLogAyudantia().guardarSolicitudserayudante(solicitudserayudante);
                    solicitudserayudante.setFkIdSolicitudAyudantia(solAyudActividadEsperandoConf.getIdSolicitudAyudantia());
                    solicitudserayudante2 = logica.getLogAyudantia().clonarSolicitudserayudante(solicitudserayudante); // Este es una Solicitud que se usara en "Confirmacion del Estudiante"
                    prjSession.setProperty("idTempSolicitudActividad", solicitudserayudante2.getIdSolicitudSerAyudante() + "");
                    String nombreActividad2 = Constantes.SolicitarSerAyudante.confirmarAceptacion;
                    prjSession.setNodeType(nombreActividad2, hero.interfaces.Constants.Nd.AND_JOIN_NODE);

                    usrSession.startActivity(nombreInstanciaProceso2, nombreActividadProrroga);
                    usrSession.terminateActivity(nombreInstanciaProceso2, nombreActividadProrroga);

                    //enviar mail de notificacion
                    String pattern = "dd/MM/yyyy";
                    SimpleDateFormat sdf = new SimpleDateFormat();
                    sdf.applyPattern(pattern);
                    String tipoAyudantia="";
                    if(solAyudActividadEsperandoConf.getFkIdAyudantiaVaria()!=0){
                      tipoAyudantia= "Actividades varias";
                    }
                     if(solAyudActividadEsperandoConf.getFkIdMateria()!=0){
                        tipoAyudantia= "Académica";
                     }
                    String to = logica.leerPersona(solicitudserayudante.getFkIdEstudiante()).getCorreo();
                    String subject = Constantes.MensajesCorreo.tituloCorreo + "Ud. ha sido seleccionado para ser ayudante de " + solAyudActividadEsperandoConf.toString();
                    String message = Constantes.TipoSolicitud.SerAyudante + "_" + solicitudserayudante.getIdSolicitudSerAyudante() +
                            "\n\n" + "Ayudantía " + tipoAyudantia + " " + solAyudActividadEsperandoConf.toString() +
                            "\n\n" + "Ud. ha sido seleccionado para ser ayudante a " + solicitudserayudante.getHorasContrato() + " horas" +
                            "\n\n" + "Se ha extendido el límite de recepción de su confirmación. Ahora debe responder si acepta o no la ayudantía hasta el " + sdf.format(solicitudserayudante.getFechaMaxRecepcionConfirmacion()) + "\n" +
                            "\n\n" + "Puede realizar esta actividad dirigiéndose a la sección actividades pendientes del sistema." + Constantes.MensajesCorreo.referenciaSistema;
                    SendMailEspol sendMail = new SendMailEspol(to, subject, message);
                    sendMail.send();
                }
            }
            logica.autentica(usuarioConectado.getUsuario(), usuarioConectado.getPassword());
        } catch (MensajeException exception) {
            throw exception;
        } catch (Exception exception) {
            exception.printStackTrace();
            Logger.getLogger(CTRL_AnalisisDeResultadosDespuesDeConfirmacion.class.getName()).log(Level.SEVERE, null, exception);

            throw new MensajeException("No es posible guardar los datos la solicitud. Por favor, intente luego de unos minutos.");
        }
    }

    public void solicitarContrato() throws MensajeException {
        String nombreInstanciaProceso;
        BnNodeValue actividad;
        Solicitudayudantia solicitudAyudantia;
        ArrayList<Rg_CandidatoAyudante> listaRg_CandidatoAyudante;
        Rg_CandidatoAyudante rg_candidato;
        try {
            boolean existeContratado = false;
            listaRg_CandidatoAyudante = gui.getDp_SeleccionAyudantes().getListaRg_CandidatoAyudante();
            for (Object object : listaRg_CandidatoAyudante) {
                rg_candidato = (Rg_CandidatoAyudante) object;
                if (rg_candidato.getSolicitudserayudante().getRespuestaConfirmacion().equals(Constantes.Atributo.DecisionConfirmacion.Aceptar.toString())) {
                    existeContratado = true;
                }
            }
            if (!existeContratado) {
                throw new Exception("Esta acción no es posible mientras no existan aspirantes que hayan aceptado la ayudantía");
            }
            nombreInstanciaProceso = getNombreInstanciaProceso();
            this.inicializarInstancia(nombreInstanciaProceso);
            actividad = usrSession.getNode(nombreInstanciaProceso, nombreActividad);
            if (!(actividad != null && (actividad.getState() == hero.interfaces.Constants.Nd.READY || actividad.getState() == hero.interfaces.Constants.Nd.ANTICIPABLE))) {
                throw new Exception();
            }
            int idSolicitudAyudantia = Integer.parseInt(prjSession.getProperty(Constantes.Atributo.idSolicitudProceso).getTheValue());
            solicitudAyudantia = logica.getLogAyudantia().leerSolicitudayudantiaNivel2(idSolicitudAyudantia);
            solicitudAyudantia = logica.getLogAyudantia().guardarYClonarSolicitudAyudantia(solicitudAyudantia);
            prjSession.setNodeProperty(nombreActividad, Constantes.Atributo.idSolicitudActividad, solicitudAyudantia.getIdSolicitudAyudantia() + "");
            prjSession.setNodeProperty(nombreActividad, Constantes.Atributo.decisionEvaluacion,
                    Constantes.Atributo.Decision.EnviarInformeDeSeleccion.toString());
            usrSession.startActivity(nombreInstanciaProceso, nombreActividad);
            usrSession.terminateActivity(nombreInstanciaProceso, nombreActividad);

            //enviar mail de notificacion

            int idDecano = new Integer(logica.leerConfiguracionPorNombre(Constantes.Configuracion.Decano.getNombreEnBD()).getValor());
            String to = logica.leerPersona(idDecano).getCorreo();
            int idSolicitudCompleta = solicitudAyudantia.getFkParent();
            solicitudAyudantia = logica.getLogAyudantia().leerSolicitudayudantiaNivel2(idSolicitudCompleta);
            String tipoAyudantia="";
                    if(solicitudAyudantia.getFkIdAyudantiaVaria()!=0){
                        tipoAyudantia= "Actividades varias";
                    }
                     if(solicitudAyudantia.getFkIdMateria()!=0){
                        tipoAyudantia= "Académica";
                    }
            String subject = Constantes.MensajesCorreo.tituloCorreo + "Revisión de informe de selección de ayudantes: " +
                      solicitudAyudantia.toString() + " pendiente";
            String message = Constantes.TipoSolicitud.Ayudantia + "_" + solicitudAyudantia.getIdSolicitudAyudantia()
                    +": " + Constantes.SolicitarAyudantes.revisarInformeSeleccion +
                    "\n\n" + "Título: Ayudantía "+ tipoAyudantia + " " + solicitudAyudantia.toString() + "\n" +
                    "Solicitante: " + logica.leerPersona(solicitudAyudantia.getFkIdProfesor()).toString() + "\n\n" +
                    "La solicitud está en espera de su revisión." +
                    "\n\n" + "Puede realizar la actividad dirigiéndose a la sección actividades pendientes del sistema."
                   + Constantes.MensajesCorreo.referenciaSistema;
            SendMailEspol sendMail = new SendMailEspol(to, subject, message);
            sendMail.send();
            
        } catch (MensajeException exception) {
            throw exception;
        } catch (Exception exception) {
            exception.printStackTrace();
            Logger.getLogger(CTRL_AnalisisDeResultadosDespuesDeConfirmacion.class.getName()).log(Level.SEVERE, null, exception);

            throw new MensajeException(Constantes.Mensajes.noGuarda);
        }
    }

    public void volveraSeleccionarAyudantes() throws MensajeException {
        String nombreInstanciaProceso;
        BnNodeValue actividad;
        Solicitudayudantia solicitudAyudantia;
        try {
            nombreInstanciaProceso = getNombreInstanciaProceso();
            this.inicializarInstancia(nombreInstanciaProceso);
            actividad = usrSession.getNode(nombreInstanciaProceso, nombreActividad);
            if (!(actividad != null && (actividad.getState() == hero.interfaces.Constants.Nd.READY || actividad.getState() == hero.interfaces.Constants.Nd.ANTICIPABLE))) {
                throw new Exception();
            }
            int idSolicitudAyudantia = Integer.parseInt(prjSession.getProperty(Constantes.Atributo.idSolicitudProceso).getTheValue());
            solicitudAyudantia = logica.getLogAyudantia().leerSolicitudayudantiaNivel3(idSolicitudAyudantia);

            solicitudAyudantia = logica.getLogAyudantia().guardarYClonarSolicitudAyudantia(solicitudAyudantia);
            prjSession.setNodeType(Constantes.SolicitarAyudantes.esperarConfirmacion, hero.interfaces.Constants.Nd.AND_JOIN_NODE);
            prjSession.setNodeProperty(nombreActividad, Constantes.Atributo.idSolicitudActividad, solicitudAyudantia.getIdSolicitudAyudantia() + "");
            prjSession.setNodeProperty(nombreActividad, Constantes.Atributo.decisionEvaluacion,
                    Constantes.Atributo.Decision.RealizarNuevaSeleccion.toString());

            usrSession.startActivity(nombreInstanciaProceso, nombreActividad);
            usrSession.terminateActivity(nombreInstanciaProceso, nombreActividad);
            volveraSeleccionarEstudiantes(solicitudAyudantia);


        } catch (MensajeException exception) {
            throw exception;
        } catch (Exception exception) {
            exception.printStackTrace();
            Logger.getLogger(CTRL_AnalisisDeResultadosDespuesDeConfirmacion.class.getName()).log(Level.SEVERE, null, exception);

            throw new MensajeException(Constantes.Mensajes.noGuarda);
        }

    }

    private void volveraSeleccionarEstudiantes(Solicitudayudantia solAyudActividadAnalisis) throws MensajeException {
        BnNodeValue actividad;
        Usuario usuarioConectado;
        ArrayList<Rg_CandidatoAyudante> listaRg_CandidatoAyudante;
        usuarioConectado = (Usuario) externalContext.getSessionMap().get(AuthenticationPhaseListener.USER_SESSION_KEY);
        Rg_CandidatoAyudante rg_candidato;
        String nombreActividadProrroga = Constantes.SolicitarSerAyudante.prorrogarConfirmacion;

        listaRg_CandidatoAyudante = gui.getDp_SeleccionAyudantes().getListaRg_CandidatoAyudante();
        logica.autenticaComodin();
        Solicitudserayudante solicitudserayudante;
        Solicitudserayudante solicitudserayudante2;
        try {
            ProjectSession prjSession = logica.getProjectSession();
            UserSession usrSession = logica.getUserSession();

            if ((usrSession == null)) {
                throw new Exception("UserSession no pudo ser inicializado");
            }
            if ((prjSession == null)) {
                throw new Exception("ProjectSession no pudo ser inicializado");
            }
            for (Object object : listaRg_CandidatoAyudante) {
                rg_candidato = (Rg_CandidatoAyudante) object;
                String nombreInstanciaProceso2 = rg_candidato.getSolicitudserayudante().getNombreinstanciaproceso();
                solicitudserayudante = rg_candidato.getSolicitudserayudante();
                if (rg_candidato.getSolicitudserayudante().getRespuestaConfirmacion().equals(
                        Constantes.Atributo.DecisionConfirmacion.NoContestar.toString())) {
                    if (nombreInstanciaProceso2 == null) {
                        throw new Exception("El nombre de la instancia no fue especificado");
                    }
                    usrSession.getModelInstancesTodoList(nombreInstanciaProceso2);
                    prjSession.initProject(nombreInstanciaProceso2);
                    actividad = usrSession.getNode(nombreInstanciaProceso2, nombreActividadProrroga);
                    if (!(actividad != null &&
                            (actividad.getState() == hero.interfaces.Constants.Nd.READY ||
                            actividad.getState() == hero.interfaces.Constants.Nd.ANTICIPABLE))) {
                        throw new Exception();
                    }
                    solicitudserayudante.setSeleccionado(false);
                    logica.getLogAyudantia().guardarSolicitudserayudante(solicitudserayudante);

                    //Relizar actividad Prorrogar confirmacion de los estudiantes                 
                    solicitudserayudante2 = logica.getLogAyudantia().leerSolicitudserayudante(solicitudserayudante.getIdSolicitudSerAyudante());
                    solicitudserayudante2.setFkIdSolicitudAyudantia(solAyudActividadAnalisis.getIdSolicitudAyudantia());
//                    solicitudserayudante2.setFechamodificacion(new Date(fechamod.getTime()));

                    //para la actividad Prorrogar confirmacion
                    solicitudserayudante2 = logica.getLogAyudantia().clonarSolicitudserayudante(solicitudserayudante2);
                    prjSession.setNodeProperty(nombreActividadProrroga, Constantes.Atributo.idSolicitudActividad, solicitudserayudante2.getIdSolicitudSerAyudante() + "");
                    prjSession.setNodeProperty(nombreActividadProrroga, Constantes.Atributo.decisionProrrogar,
                            Constantes.Atributo.DecisionProrrogar.RealizarNuevaSeleccion.toString());

                    usrSession.startActivity(nombreInstanciaProceso2, nombreActividadProrroga);
                    usrSession.terminateActivity(nombreInstanciaProceso2, nombreActividadProrroga);
                }
            }
            logica.autentica(usuarioConectado.getUsuario(), usuarioConectado.getPassword());
        } catch (MensajeException exception) {
            throw exception;
        } catch (Exception exception) {
            exception.printStackTrace();
            Logger.getLogger(CTRL_AnalisisDeResultadosDespuesDeConfirmacion.class.getName()).log(Level.SEVERE, null, exception);
            throw new MensajeException(Constantes.Mensajes.noGuarda);
        }
    }

    public void cancelarProceso() throws MensajeException {

        String nombreInstanciaProceso;
        BnNodeValue actividad;
        Solicitudayudantia solicitud2;
        try {
            Solicitudayudantia solicitud;
            nombreInstanciaProceso = this.getNombreInstanciaProceso();
            this.inicializarInstancia(nombreInstanciaProceso);
            actividad = usrSession.getNode(nombreInstanciaProceso, nombreActividad);
            if (!(actividad != null &&
                    (actividad.getState() == hero.interfaces.Constants.Nd.READY ||
                    actividad.getState() == hero.interfaces.Constants.Nd.ANTICIPABLE))) {
                throw new Exception();
            }
            int idSolicitud = Integer.parseInt(prjSession.getProperty(Constantes.Atributo.idSolicitudProceso).getTheValue());
            solicitud = logica.getLogAyudantia().leerSolicitudayudantiaNivel3(idSolicitud);
            solicitud.setEstado(Constantes.EstadoSolicitud.Cancelada.toString());
            solicitud2 = logica.getLogAyudantia().guardarYClonarSolicitudAyudantia(solicitud);
            prjSession.setNodeProperty(nombreActividad, Constantes.Atributo.idSolicitudActividad, solicitud2.getIdSolicitudAyudantia() + "");
            prjSession.setNodeProperty(nombreActividad, Constantes.Atributo.decisionEvaluacion,
                    Constantes.Atributo.Decision.Cancelar.toString());
            usrSession.startActivity(nombreInstanciaProceso, nombreActividad);
            usrSession.terminateActivity(nombreInstanciaProceso, nombreActividad);
            cancelarProcesosEstudiantes(solicitud);

             //enviar mail de notificacion

            int idDecano = new Integer(logica.leerConfiguracionPorNombre(Constantes.Configuracion.Decano.getNombreEnBD()).getValor());
            String to = logica.leerPersona(idDecano).getCorreo();
            String tipoAyudantia="";
                    if(solicitud.getFkIdAyudantiaVaria()!=0){
                        tipoAyudantia= "Actividades varias";
                    }
                     if(solicitud.getFkIdMateria()!=0){
                        tipoAyudantia= "Académica";
                    }
            String subject = Constantes.MensajesCorreo.tituloCorreo + "Cancelación de concurso de ayudantía: " +
                      solicitud.toString() ;
            String message = Constantes.TipoSolicitud.Ayudantia + "_" + solicitud.getIdSolicitudAyudantia() +
                    "\n\n" + "Título: Ayudantía "+ tipoAyudantia + " " + solicitud.toString() + "\n" +
                    "Solicitante: " + logica.leerPersona(solicitud.getFkIdProfesor()).toString() + "\n\n" +
                    "El profesor solicitante ha decidido cancelar el concurso de ayudantía." +
                    Constantes.MensajesCorreo.referenciaSistema;
            SendMailEspol sendMail = new SendMailEspol(to, subject, message);
            sendMail.send();

        } catch (MensajeException ex) {
            throw ex;
        } catch (Exception exception) {
            exception.printStackTrace();
            Logger.getLogger(CTRL_AnalisisDeResultadosDespuesDeConfirmacion.class.getName()).log(Level.SEVERE, null, exception);

            throw new MensajeException(Constantes.Mensajes.noGuarda);
        }
    }

    private void cancelarProcesosEstudiantes(Solicitudayudantia solicitudayudantia) throws MensajeException, NamingException, CreateException, RemoteException, RemoteException, HeroException, HeroException, Exception {
        Usuario usuarioConectado;
        SessionBean1 sessionBean1 = (SessionBean1) externalContext.getSessionMap().get("SessionBean1");
        usuarioConectado = (Usuario) externalContext.getSessionMap().get(AuthenticationPhaseListener.USER_SESSION_KEY);
        logica.autenticaComodin();
        logica.getLogAyudantia().cancelarProcesosSolicitarSerAyudante(solicitudayudantia);
        logica.autentica(usuarioConectado.getUsuario(), usuarioConectado.getPassword());

    }
}
